package dao;

import hbt.HibernateUtil;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Hibernate;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;

import entidades.EstadoProyecto;
import entidades.Proyecto;
import entidades.TipoProyecto;



public class ProyectoDAO {
	
	private static ProyectoDAO instancia = null;
	private static SessionFactory sf = null;
	
	public static ProyectoDAO getInstancia(){
		if(instancia == null){
			sf = HibernateUtil.getSessionFactory();
			instancia = new ProyectoDAO();
		} 
		return instancia;
	}
	
	public void guardarUnProyecto(Proyecto proyecto){
		Session session = sf.openSession();
		session.beginTransaction();
		session.saveOrUpdate(proyecto); 
		session.getTransaction().commit();
		session.close();
	}
	
	@SuppressWarnings("unchecked")
	public List<Proyecto> obtenerListaProyectosActivos() throws Exception {
		try {
			Session session = sf.openSession();
			Query q = session.createQuery("from Proyecto where ID_ESTADO = " + 1 );
			List<Proyecto> listaProyecto = new ArrayList<Proyecto>(q.list());
			session.close();
			return listaProyecto;
		} catch (Exception e) {
			throw e;
		}
	}
	
	@SuppressWarnings("unchecked")
	public Proyecto obtenerProyectoActivoAlAzar() throws Exception {
		try {
			Session session = sf.openSession();
			Query q = session.createQuery("from Proyecto where ID_ESTADO = 1 order by newid()");
			List<Proyecto> listaProyectos = new ArrayList<Proyecto>(q.list());
			session.close();
			return listaProyectos.get(0);
		} catch (Exception e) {
			throw e;
		}
	}	
	
	@SuppressWarnings("unchecked")
	public List<Proyecto> obtenerListaTodosLosProyectos() throws Exception {
		try {
			Session session = sf.openSession();
			Query q = session.createQuery("from Proyecto ");
			List<Proyecto> listaProyecto = new ArrayList<Proyecto>(q.list());
			session.close();
			return listaProyecto;
		} catch (Exception e) {
			throw e;
		}
	}
	
	public void updateProyecto(Proyecto proyecto) {
		Session session = sf.openSession();
		session.beginTransaction();
		session.update(proyecto);
		session.getTransaction().commit();
		session.close();
		
	}
	
	
	public void actualizarEstadoProyecto(Proyecto proyecto, EstadoProyecto estadoProyecto) throws Exception {
		try {
			Session session = sf.openSession();
			Query q = session.createQuery("update Proyecto set ID_ESTADO = "+estadoProyecto.getIdEstadoProyecto()+" where ID_PROYECTO = "+proyecto.getIdProyecto());
			q.executeUpdate();
			session.close();
		} catch (Exception e) {
			throw e;
		}
	}
	
	@SuppressWarnings("unchecked")
	public EstadoProyecto obtenerEstadoProyecto(int idEstadoProyecto) throws Exception {
		try {
			Session session = sf.openSession();
			Query q = session.createQuery("from EstadoProyecto where ID_ESTADO = "+idEstadoProyecto);
			List<EstadoProyecto> listaProyectos = new ArrayList<EstadoProyecto>(q.list());
			session.close();
			return listaProyectos.get(0);
		} catch (Exception e) {
			throw e;
		}
	}
	
	@SuppressWarnings("unchecked")
	public EstadoProyecto obtenerEstadoProyectoAlAzar() throws Exception {
		try {
			Session session = sf.openSession();
			Query q = session.createQuery("from EstadoProyecto order by newid()");
			List<EstadoProyecto> listaProyectos = new ArrayList<EstadoProyecto>(q.list());
			session.close();
			return listaProyectos.get(0);
		} catch (Exception e) {
			throw e;
		}
	}
	
	public void guardarEstadoProyecto(EstadoProyecto fa){
		Session session = sf.openSession();
		session.beginTransaction();
		session.saveOrUpdate(fa); 
		session.getTransaction().commit();
		session.close();
	}
	
	public void guardarTipoProyecto(TipoProyecto fa){
		Session session = sf.openSession();
		session.beginTransaction();
		session.saveOrUpdate(fa); 
		session.getTransaction().commit();
		session.close();
	}
	
	@SuppressWarnings("unchecked")
	public List<TipoProyecto> obtenerListaTiposProyecto() throws Exception {
		try {
			Session session = sf.openSession();
			Query q = session.createQuery("from TipoProyecto");
			List<TipoProyecto> listaEstadosProyecto = new ArrayList<TipoProyecto>(q.list());
			session.close();
			return listaEstadosProyecto;
		} catch (Exception e) {
			throw e;
		}
	}
	
	@SuppressWarnings("unchecked")
	public TipoProyecto obtenerTipoProyectoAlAzar() throws Exception {
		try {
			Session session = sf.openSession();
			Query q = session.createQuery("from TipoProyecto order by newid()");
			List<TipoProyecto> listaProyectos = new ArrayList<TipoProyecto>(q.list());
			session.close();
			return listaProyectos.get(0);
		} catch (Exception e) {
			throw e;
		}
	}
	
	@SuppressWarnings("unchecked")
	public List<Object> obtenerDetalleAsignaciones(Proyecto proyecto) throws Exception {
		try {
			Session session = sf.openSession();			
			Query q1 = session.createSQLQuery(
					" select ru.DESC_RUBRO, count(*) as CANT "+
					" from obreros o inner join rubros ru on ru.id_rubro = o.id_rubro "+
					" where id_proyecto = "+proyecto.getIdProyecto()+ 
					" group by ru.desc_rubro"+
					" order by ru.DESC_RUBRO")
					.addScalar("DESC_RUBRO",Hibernate.STRING)
					.addScalar("CANT",Hibernate.INTEGER);
			List<Object> listaDetalle = new ArrayList<Object>(q1.list());  
			
			session.close();
			return listaDetalle;
		} catch (Exception e) {
			throw e;
		}
	}
	
}
	


